home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / lib / tex / docsty.c < prev    next >
C/C++ Source or Header  |  1987-08-10  |  2KB  |  103 lines

  1. /*
  2.   DOCSTY.C
  3.  
  4.   Convert TeX DOC files to TeX STY files for faster loading.
  5.   Tony Li
  6.   5/22/86
  7.  
  8.   Copyright (c) 1986
  9.   University of Southern California
  10. */
  11.  
  12. #include <stdio.h>
  13. #include <ctype.h>
  14. #define STRLEN 256
  15. #define WHITE 1
  16. #define BLACK 2
  17. #define COMMENT '%'
  18. #define SP ' '
  19. #define NL '\n'
  20. #define CR '\r'
  21. #define THRESH 79
  22.  
  23. #define SAVECHAR    {buf[linelen++] = ch;}
  24. #define TESTBUF        {if (linelen > THRESH) dumpline(out);}
  25.  
  26. char buf [STRLEN];
  27. int linelen = 0;
  28.  
  29. main (argc, argv)
  30. int argc;
  31. char *argv[];
  32. {
  33.   char dest[STRLEN];
  34.   FILE *in, *out;
  35.   int state, ret;
  36.   char ch;
  37.  
  38.   strcpy (dest, argv[1]);
  39.   strcat (argv[1], ".doc");
  40.   strcat (dest, ".sty");
  41.   in = fopen (argv[1], "r");
  42. #ifdef vms
  43.   out = fopen (dest, "w", "rfm=var", "rat=cr");
  44. #endif
  45. #ifdef unix
  46.   out = fopen (dest, "w");
  47. #endif
  48.   state = WHITE;
  49.   while ((ch = getc(in)) != EOF) {
  50.     if (ch == COMMENT)        /* If its a comment, read the rest. */
  51.       while ((ch = getc (in)) != EOF && ch != NL);
  52.     if (isspace (ch)) {        /* If its blank then */
  53.       if (state == BLACK) {    /* if we haven't seen a space then */
  54.     ch = SP;
  55.     TESTBUF;        /* put it out */
  56.     SAVECHAR;        /* and append a space */
  57.     state = WHITE;        /* and we've seen a space */
  58.       }                /* otherwise, ignore */
  59.     }
  60.     else {            /* its a char */
  61.     SAVECHAR;        /* save it */
  62.     state = BLACK;        /* we saw it */
  63.       }
  64.   };
  65.   emptybuf (out);
  66.   fclose (in);
  67.   fclose (out);
  68. }
  69.  
  70. dumpline (out)            /* Figure out where to dump the buffer. */
  71.      FILE *out;            /* Invariant: linelen points past the */
  72. {                /* end, so you can always put a NULL there. */
  73.   char *pt, *st;
  74.  
  75.   buf[linelen] = NULL;        /* Terminate the string */
  76.   pt = &buf[linelen - 1];    /* Point to the char before */
  77.   st = &buf[0];            /* Point to the start */
  78.   while (!isspace(*pt) && pt > st)
  79.     pt--;            /* Run back until a space */
  80.   if (pt == st) {        /* Theres no middle space */
  81.     fputs (st, out);        /* Put it out */
  82.     fputc (NL, out);        /* Make it a line */
  83.     linelen = 0;        /* No chars left */
  84.   }
  85.   else {
  86.     *pt = NULL;            /* End the string */
  87.     fputs (st, out);        /* Put it out */
  88.     fputc (NL, out);        /* Make it a line */
  89.     pt++;            /* Point to the remaining string */
  90.     while (*pt) *st++ = *pt++;    /* Copy the string */
  91.     *st = NULL;            /* Terminate it */
  92.     linelen = strlen (buf);    /* Figure the new length */
  93.   };
  94. }
  95.  
  96. emptybuf (out)            /* Clear the buffer */
  97.      FILE *out;
  98. {
  99.   buf[linelen] = NULL;        /* Terminate it */
  100.   fputs (buf, out);        /* Put it out */
  101.   fputc (NL, out);        /* Make it a line */
  102. }
  103.